package main

import "fmt"

// IF 接口定义
type IF interface {
	getName() string
}

// Human 结构定义
type Human struct {
	firstName, lastName string
}

// Plane 结构定义
type Plane struct {
	vendor string
	model  string
}

// Car 结构
type Car struct {
	factory, model string
}

// 结构 Human 实现接口 IF 的 getName() 方法
func (h *Human) getName() string {
	return h.firstName + "," + h.lastName
}

// 结构 Car 实现接口 IF 的 getName() 方法
func (c *Car) getName() string {
	return c.factory + "-" + c.model
}

// 结构 Plane 实现接口 IF 的 getName() 方法
func (p Plane) getName() string {
	return fmt.Sprintf("vendor: %s, model: %s", p.vendor, p.model)
}

func main() {

	// 初始化 IF 接口数组
	interfaces := []IF{}

	// 初始化一个 Human 结构 & 添加到数组 interfaces 中
	h := new(Human)
	h.firstName = "first"
	h.lastName = "last"
	interfaces = append(interfaces, h)

	// 初始化一个 Car 结构 & 添加到数组 interfaces 中
	c := new(Car)
	c.factory = "benz"
	c.model = "s"
	interfaces = append(interfaces, c)

	// 遍历 interfaces 数组 & 打印
	for _, f := range interfaces {
		fmt.Println(f.getName())
	}

	// 初始化 Plane 结构
	p := Plane{}
	p.vendor = "testVendor"
	p.model = "testModel"
	fmt.Println(p.getName())
}
